home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / uae / uae-0.4.3 / genblitter.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  2KB  |  91 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Optimized blitter minterm function generator
  5.   * 
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11.  
  12. #include "config.h"
  13. #include "amiga.h"
  14.  
  15. static bool bitset(int mt, int bit)
  16. {
  17.     return mt & (1<<bit);
  18. }
  19.  
  20. int main(void)
  21. {
  22.     int minterm;
  23.     printf("static __inline__ UWORD blit_func(UWORD srca, UWORD srcb, UWORD srcc, UBYTE mt)\n{\nswitch(mt){\n");
  24.     for (minterm = 0; minterm < 256; minterm++) {
  25.     bool firstor = true;
  26.     int bits = 0;
  27.     int i;
  28.     printf("case 0x%x:\n", minterm);
  29.     printf("\treturn ");
  30.     for(i=0; i<8; i++) {
  31.         if (bitset(minterm, i) && !bitset(bits,i)) {
  32.         int j;
  33.         int dontcare = 0;
  34.         bool firstand = true;
  35.         int bitbucket[8], bitcount;
  36.         
  37.         bits |= 1<<i;
  38.         bitcount = 1; bitbucket[0] = i;
  39.         for(j=1; j<8; j *= 2) {
  40.             bool success = true;
  41.             int k;
  42.             for(k=0; k < bitcount; k++) {            
  43.             if (!bitset(minterm, bitbucket[k] ^ j)) {
  44.                 success = false;
  45.             }
  46.             }
  47.             if (success) {
  48.             int l;
  49.             dontcare |= j;
  50.             for(l=bitcount; l < bitcount*2; l++) {
  51.                 bitbucket[l] = bitbucket[l-bitcount] ^ j;
  52.                 bits |= 1 << bitbucket[l];
  53.             }
  54.             bitcount *= 2;
  55.             }
  56.         }
  57.         if (firstor) {
  58.             firstor = false;
  59.         } else {
  60.             printf(" | ");
  61.         }
  62.         for (j=1; j<8; j *= 2) {
  63.             if (!(dontcare & j)) {
  64.             if (firstand) {
  65.                 firstand = false;
  66.                 printf("(");
  67.             } else {
  68.                 printf(" & ");
  69.             }
  70.             if (!(i & j))
  71.                 printf("~");
  72.             printf("src%c", (j == 1 ? 'c' : j == 2 ? 'b' : 'a'));
  73.             }
  74.         }
  75.         if (!firstand) {            
  76.             printf(")");
  77.         } else {
  78.             printf("0xFFFF");
  79.         }
  80.         }
  81.     }
  82.     if (firstor)
  83.         printf("0");
  84.     printf(";\n");
  85.     }
  86.     printf("}\n");
  87.     printf("return 0;\n"); /* No, sir, it doesn't! */
  88.     printf("}\n");
  89.     return 0;
  90. }
  91.